package br.com.future.mail;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;


import br.com.future.dao.interfaces.BloqueioDesbloqueioDAOI;
import br.com.future.dao.interfaces.DAOFactory;
import br.com.future.model.Advogado;
import br.com.future.model.BloqueioDesbloqueio;
import br.com.future.model.Titulo;

/**
 * CLASSE PARA ENVIAR O EMAIL NO GMAIL.
 * 
 * @author future
 *
 */
public class EnviaEmail {
    
    private static final String emailRemetente = "futuretechnologybrazil@gmail.com";
    private static final String senhaRemetente = "futuretechnologybrazil";
    private static final String emailDestinatarioAdvogado = "futuretechnologybrazil@gmail.com";
    private static final String emailDestinatarioCliente = "futuretechnologybrazil@gmail.com";
    private static String saudacao = null;
    private static String assunto = null;
    private static String mensagem = null;
    private static String jurosTipoCrobranca = null;
    private static String taxaMoraDiaria = null;
    private static String avisoAdvAudiencia = null;
    private static String avisoAdvHonorario = null;
    private static Titulo titulo = null;
    public EnviaEmail(){
        
    }

    public static void enviar(Titulo tituloFinal) {
        try {
        	titulo = tituloFinal;
        	preencherDadosEmailCliente();
        	enviarEmailCliente();
        	preencherDadosEmailAdvogado();
            enviarEmailAdvogado();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

	private static void enviarEmailCliente()throws MessagingException,
	AddressException {
		Session mailSession = configurarGmail();

		//CONFIG. DA MENSAGEM 
		Message mailMessage = new MimeMessage(mailSession);

		mailMessage.setFrom(new InternetAddress(emailRemetente));
		mailMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emailDestinatarioCliente));        

		MimeBodyPart mbpMensagem = new MimeBodyPart();
		mbpMensagem.setText(saudacao + "\n" + mensagem +"\n" + jurosTipoCrobranca +"\n" + taxaMoraDiaria);

		//PARTES DO EMAIL
		Multipart mp = new MimeMultipart();
		mp.addBodyPart(mbpMensagem);
		

		//ASSUNTO DO EMAIL
		mailMessage.setSubject(assunto);
		
		//SELECIONA O CONTEUDO
		mailMessage.setContent(mp);

		//ENVIA O EMAIL
		Transport.send(mailMessage);
		
	}

	public static void enviarEmailAdvogado() throws MessagingException,
			AddressException {
		Session mailSession = configurarGmail();

		//CONFIG. DA MENSAGEM 
		Message mailMessage = new MimeMessage(mailSession);

		mailMessage.setFrom(new InternetAddress(emailRemetente));
		mailMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emailDestinatarioAdvogado));        

		MimeBodyPart mbpMensagem = new MimeBodyPart();
		mbpMensagem.setText(saudacao + "\n" +assunto + "\n" +mensagem +"\n" + avisoAdvAudiencia +"\n" + avisoAdvHonorario);

		//PARTES DO EMAIL
		Multipart mp = new MimeMultipart();
		mp.addBodyPart(mbpMensagem);
		

		//ASSUNTO DO EMAIL
		mailMessage.setSubject(assunto);
		
		//SELECIONA O CONTEUDO
		mailMessage.setContent(mp);

		//ENVIA O EMAIL
		Transport.send(mailMessage);
	}

	private static Session configurarGmail() {
		//CONFIG. DO GMAIL
		Properties mailProps = new Properties();
		mailProps.put("mail.transport.protocol", "smtp");
		mailProps.put("mail.smtp.starttls.enable","true");
		mailProps.put("mail.smtp.host", "smtp.gmail.com");
		mailProps.put("mail.smtp.auth", "true");
		mailProps.put("mail.smtp.user", emailRemetente);
		mailProps.put("mail.debug", "true");
		mailProps.put("mail.smtp.port", "465");
		mailProps.put("mail.smtp.socketFactory.port", "465");
		mailProps.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		mailProps.put("mail.smtp.socketFactory.fallback", "false");

		Session mailSession = Session.getInstance(mailProps, new Authenticator() {                  
		    public PasswordAuthentication getPasswordAuthentication(){              
		        return new PasswordAuthentication(emailRemetente, senhaRemetente);
		    }
		});
		mailSession.setDebug(false);
		return mailSession;
	}
    
    public static Properties carregarConfiguracoesCliente() {
		Properties propCli = new Properties();
		InputStream is = null;
		try {
			is = EnviaEmail.class.getResourceAsStream("emailCliente.properties");
			propCli.load(is);
		} catch (IOException e) {
			e.getMessage();
		}
		return propCli;
	}
    
    public static Properties carregarConfiguracoesAdvogado() {
		Properties propAdv = new Properties();
		InputStream is = null;
		try {
			is = EnviaEmail.class.getResourceAsStream("EmailAdv.properties");
			propAdv.load(is);
		} catch (IOException e) {
			e.getMessage();
		}
		return propAdv;
	}

	private static void preencherDadosEmailCliente() {
		Properties pro = carregarConfiguracoesCliente();
		saudacao = pro.getProperty("cabecalho")+ " " + titulo.getProcesso().getCliente().getNomePessoa();
		assunto = pro.getProperty("assunto") + " " +  titulo.getProcesso().getNumeroProcesso();
		BloqueioDesbloqueioDAOI bloqueioDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getBloqueioDesbloqueioDAO();
		BloqueioDesbloqueio motivobloqueio = bloqueioDAO.consultar(1);
        mensagem = pro.getProperty("notificacao") + " " + motivobloqueio.getDescricaoBloqueioDesbloqueio();
        jurosTipoCrobranca = pro.getProperty("juros")+ " " +titulo.getProcesso().getTipoCobranca().getDescricaoCobranca();
		taxaMoraDiaria = pro.getProperty("jurosMoraDiario");
	}
	
	private static void preencherDadosEmailAdvogado() {
		Properties pro = carregarConfiguracoesAdvogado();
		List<Advogado> advogados = titulo.getProcesso().getAdvogados();
		String nomeAdv = null;
		for (Advogado advogado : advogados) {
			if (nomeAdv == null) {
				nomeAdv = advogado.getNomePessoa();
			}else {
				nomeAdv = nomeAdv + " / " +advogado.getNomePessoa();
			}
		}
		saudacao = pro.getProperty("cabecalho")+nomeAdv;
		assunto = pro.getProperty("assunto") + titulo.getProcesso().getNumeroProcesso();
		mensagem = pro.getProperty("notificacao");
		avisoAdvAudiencia = pro.getProperty("avisoAudiencia");
		avisoAdvHonorario = pro.getProperty("avisoHonorario");
		
	}
}
